/*
 * SPDX-FileCopyrightText: 2022-2024 Andrew Gunnerson
 * SPDX-License-Identifier: GPL-3.0-only
 */

package com.sanji.audio_test.extension

import android.annotation.SuppressLint
import android.media.AudioFormat
import android.os.Build

/**
 * 兼容性扩展属性，用于获取音频格式的帧大小（以字节为单位）
 * 
 * 在 Android 10 (API 29) 及以上版本，直接使用系统提供的 frameSizeInBytes 属性
 * 在 Android 9 (API 28) 及以下版本，手动计算帧大小（假设为 PCM 16-bit 编码）
 */
val AudioFormat.frameSizeInBytesCompat: Int
    get() = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
        // Android 10 及以上版本直接使用原生属性
        frameSizeInBytes
    } else{
        // Android 9 兼容性处理：硬编码计算帧大小
        // 断言编码格式为 PCM 16-bit（每个样本占 2 字节）
        assert(encoding == AudioFormat.ENCODING_PCM_16BIT)
        // 帧大小 = 每个样本的字节数(2) × 声道数
        2 * channelCount
    }

// 静态扩展函数在 Kotlin 中目前不受支持。此外，我们同时安装了一个 sysconfig 文件
// 并设置了 usesNonSdkApi 来允许访问这些隐藏字段。usesNonSdkApi 标志更可靠，
// 但 sysconfig 文件在较旧版本的 Android 上是必需的，这些版本缺少 AOSP 提交
// ca6f81d39525174e926c2fcc824fe9531ffb3563。

/**
 * 兼容性常量，表示音频采样率的最小值
 * 通过反射访问 AudioFormat 类中的隐藏字段 SAMPLE_RATE_HZ_MIN
 */
@SuppressLint("SoonBlockedPrivateApi")
val SAMPLE_RATE_HZ_MIN_COMPAT: Int =
    AudioFormat::class.java.getDeclaredField("SAMPLE_RATE_HZ_MIN").getInt(null)

/**
 * 兼容性常量，表示音频采样率的最大值
 * 通过反射访问 AudioFormat 类中的隐藏字段 SAMPLE_RATE_HZ_MAX
 */
@SuppressLint("SoonBlockedPrivateApi")
val SAMPLE_RATE_HZ_MAX_COMPAT: Int =
    AudioFormat::class.java.getDeclaredField("SAMPLE_RATE_HZ_MAX").getInt(null)